﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace XYZshell.Game.CardGameEngine
{
	/// <summary>
	/// 条件类
	/// </summary>
	[Condition("base")]
	public abstract  class BaseCondition:GameObject, ICondition,IXMLable
	{

		public string Type
		{
			get
			{
				return GetAttribute().ID;
			}
		}


		/// <summary>
		/// 条件结果
		/// </summary>
		public bool ResultValue
		{
			get
			{
				return Result();
			}
		}

		/// <summary>
		/// 活动当前表达的表达式特性
		/// </summary>
		/// <returns></returns>
		protected ConditionAttribute GetAttribute()
		{


			object[] attrs= this.GetType().GetCustomAttributes( typeof( ConditionAttribute ), false );
			if (attrs.Length > 0)
				return attrs[0] as ConditionAttribute;
			return null;
		}

		#region ICondition 成员
		/// <summary>
		/// 条件结果
		/// </summary>
		/// <returns></returns>
		public abstract bool Result();

		#endregion
		/// <summary>
		/// 转换为XML
		/// </summary>
		/// <returns>转换后XML内容</returns>
		public  string ToXML()
		{
			StringBuilder sb=new StringBuilder();
			sb.AppendFormat( "<condition type=\"{0}\">\r\n" ,GetAttribute().ID);
			sb.Append( GetXMLContent() );
			sb.AppendFormat( "</condition>\r\n",GetAttribute().ID );
			return sb.ToString();
			
		}
		/// <summary>
		/// 转换为XML时获得XML内容
		/// </summary>
		/// <returns></returns>
		public abstract string GetXMLContent();

		/// <summary>
		/// 从XML中生成条件
		/// </summary>
		/// <param name="xmlnode"></param>
		/// <returns></returns>
		public static BaseCondition FromXML( string xmlnode )
		{

			XObject xo=new XObject( xmlnode );
			Type conditionAttr=ConditionHelper.GetConditionByID( xo.Type );
			return (BaseCondition)conditionAttr.InvokeMember( "FromXML", System.Reflection.BindingFlags.InvokeMethod, null, null, new object[] { xmlnode } );
			
		}

		#region ICondition 成员


		public event EventHandler  ResultChanged;

		#endregion
	}


	///// <summary>
	///// 条件类
	///// </summary>
	//public  class Condition
	//{
	//    ///// <summary>
	//    ///// 需要满足条件的对象
	//    ///// </summary>
	//    //public object ConditionSource
	//    //{
	//    //    get;
	//    //    set;
	//    //}
	//    /// <summary>
	//    /// 哪个玩家需要满足这些条件
	//    /// </summary>
	//    public Player Plyer
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 条件的优先级
	//    /// </summary>
	//    public int Priority
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 手牌数目必须等于
	//    /// </summary>
	//    public int HandEqual
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 手牌数目必须大于
	//    /// </summary>
	//    public int HandGreaterThan
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 手牌数目必须小于
	//    /// </summary>
	//    public int HandLessThan
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 牌组中必须包含
	//    /// </summary>
	//    public List<Card> CardSetContain
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 牌组中不能包含
	//    /// </summary>
	//    public List<Card> CardSetNotContain
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 场地包含
	//    /// </summary>
	//    public List<Card> DesktopContain
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 场地上不包含
	//    /// </summary>
	//    public List<Card> DesktopNotContain
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 场地上的卡牌数目等于
	//    /// </summary>
	//    public int DesktopEqual
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 场地上的卡牌数目大于
	//    /// </summary>
	//    public int DesktopGreaterThan
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 场地上的卡牌数目小于
	//    /// </summary>
	//    public int DesktopLessThan
	//    {
	//        get;
	//        set;
	//    }
	//    /// <summary>
	//    /// 要求的条件
	//    /// </summary>
	//    /// <typeparam name="T">条件类型</typeparam>
	//    /// <param name="conditon">表达式</param>
	//    public static  void Required<T>(bool conditon) 
	//        where T:Condition
	//    {
	//    }
	//}
}
